<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
<meta name="generator" content="AsciiDoc 8.6.6" />
<title>Release notes for Gerrit 2.1.6</title>
<style type="text/css">
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */

/* Default font. */
body {
  font-family: Georgia,serif;
}

/* Title font. */
h1, h2, h3, h4, h5, h6,
div.title, caption.title,
thead, p.table.header,
#toctitle,
#author, #revnumber, #revdate, #revremark,
#footer {
  font-family: Arial,Helvetica,sans-serif;
}

body {
  margin: 1em 5% 1em 5%;
}

a {
  color: blue;
  text-decoration: underline;
}
a:visited {
  color: fuchsia;
}

em {
  font-style: italic;
  color: navy;
}

strong {
  font-weight: bold;
  color: #083194;
}

h1, h2, h3, h4, h5, h6 {
  color: #527bbd;
  margin-top: 1.2em;
  margin-bottom: 0.5em;
  line-height: 1.3;
}

h1, h2, h3 {
  border-bottom: 2px solid silver;
}
h2 {
  padding-top: 0.5em;
}
h3 {
  float: left;
}
h3 + * {
  clear: left;
}
h5 {
  font-size: 1.0em;
}

div.sectionbody {
  margin-left: 0;
}

hr {
  border: 1px solid silver;
}

p {
  margin-top: 0.5em;
  margin-bottom: 0.5em;
}

ul, ol, li > p {
  margin-top: 0;
}
ul > li     { color: #aaa; }
ul > li > * { color: black; }

pre {
  padding: 0;
  margin: 0;
}

#author {
  color: #527bbd;
  font-weight: bold;
  font-size: 1.1em;
}
#email {
}
#revnumber, #revdate, #revremark {
}

#footer {
  font-size: small;
  border-top: 2px solid silver;
  padding-top: 0.5em;
  margin-top: 4.0em;
}
#footer-text {
  float: left;
  padding-bottom: 0.5em;
}
#footer-badges {
  float: right;
  padding-bottom: 0.5em;
}

#preamble {
  margin-top: 1.5em;
  margin-bottom: 1.5em;
}
div.imageblock, div.exampleblock, div.verseblock,
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
div.admonitionblock {
  margin-top: 1.0em;
  margin-bottom: 1.5em;
}
div.admonitionblock {
  margin-top: 2.0em;
  margin-bottom: 2.0em;
  margin-right: 10%;
  color: #606060;
}

div.content { /* Block element content. */
  padding: 0;
}

/* Block element titles. */
div.title, caption.title {
  color: #527bbd;
  font-weight: bold;
  text-align: left;
  margin-top: 1.0em;
  margin-bottom: 0.5em;
}
div.title + * {
  margin-top: 0;
}

td div.title:first-child {
  margin-top: 0.0em;
}
div.content div.title:first-child {
  margin-top: 0.0em;
}
div.content + div.title {
  margin-top: 0.0em;
}

div.sidebarblock > div.content {
  background: #ffffee;
  border: 1px solid #dddddd;
  border-left: 4px solid #f0f0f0;
  padding: 0.5em;
}

div.listingblock > div.content {
  border: 1px solid #dddddd;
  border-left: 5px solid #f0f0f0;
  background: #f8f8f8;
  padding: 0.5em;
}

div.quoteblock, div.verseblock {
  padding-left: 1.0em;
  margin-left: 1.0em;
  margin-right: 10%;
  border-left: 5px solid #f0f0f0;
  color: #888;
}

div.quoteblock > div.attribution {
  padding-top: 0.5em;
  text-align: right;
}

div.verseblock > pre.content {
  font-family: inherit;
  font-size: inherit;
}
div.verseblock > div.attribution {
  padding-top: 0.75em;
  text-align: left;
}
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
div.verseblock + div.attribution {
  text-align: left;
}

div.admonitionblock .icon {
  vertical-align: top;
  font-size: 1.1em;
  font-weight: bold;
  text-decoration: underline;
  color: #527bbd;
  padding-right: 0.5em;
}
div.admonitionblock td.content {
  padding-left: 0.5em;
  border-left: 3px solid #dddddd;
}

div.exampleblock > div.content {
  border-left: 3px solid #dddddd;
  padding-left: 0.5em;
}

div.imageblock div.content { padding-left: 0; }
span.image img { border-style: none; }
a.image:visited { color: white; }

dl {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
dt {
  margin-top: 0.5em;
  margin-bottom: 0;
  font-style: normal;
  color: navy;
}
dd > *:first-child {
  margin-top: 0.1em;
}

ul, ol {
    list-style-position: outside;
}
ol.arabic {
  list-style-type: decimal;
}
ol.loweralpha {
  list-style-type: lower-alpha;
}
ol.upperalpha {
  list-style-type: upper-alpha;
}
ol.lowerroman {
  list-style-type: lower-roman;
}
ol.upperroman {
  list-style-type: upper-roman;
}

div.compact ul, div.compact ol,
div.compact p, div.compact p,
div.compact div, div.compact div {
  margin-top: 0.1em;
  margin-bottom: 0.1em;
}

tfoot {
  font-weight: bold;
}
td > div.verse {
  white-space: pre;
}

div.hdlist {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
div.hdlist tr {
  padding-bottom: 15px;
}
dt.hdlist1.strong, td.hdlist1.strong {
  font-weight: bold;
}
td.hdlist1 {
  vertical-align: top;
  font-style: normal;
  padding-right: 0.8em;
  color: navy;
}
td.hdlist2 {
  vertical-align: top;
}
div.hdlist.compact tr {
  margin: 0;
  padding-bottom: 0;
}

.comment {
  background: yellow;
}

.footnote, .footnoteref {
  font-size: 0.8em;
}

span.footnote, span.footnoteref {
  vertical-align: super;
}

#footnotes {
  margin: 20px 0 20px 0;
  padding: 7px 0 0 0;
}

#footnotes div.footnote {
  margin: 0 0 5px 0;
}

#footnotes hr {
  border: none;
  border-top: 1px solid silver;
  height: 1px;
  text-align: left;
  margin-left: 0;
  width: 20%;
  min-width: 100px;
}

div.colist td {
  padding-right: 0.5em;
  padding-bottom: 0.3em;
  vertical-align: top;
}
div.colist td img {
  margin-top: 0.3em;
}

@media print {
  #footer-badges { display: none; }
}

#toc {
  margin-bottom: 2.5em;
}

#toctitle {
  color: #527bbd;
  font-size: 1.1em;
  font-weight: bold;
  margin-top: 1.0em;
  margin-bottom: 0.1em;
}

div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
  margin-top: 0;
  margin-bottom: 0;
}
div.toclevel2 {
  margin-left: 2em;
  font-size: 0.9em;
}
div.toclevel3 {
  margin-left: 4em;
  font-size: 0.9em;
}
div.toclevel4 {
  margin-left: 6em;
  font-size: 0.9em;
}

span.aqua { color: aqua; }
span.black { color: black; }
span.blue { color: blue; }
span.fuchsia { color: fuchsia; }
span.gray { color: gray; }
span.green { color: green; }
span.lime { color: lime; }
span.maroon { color: maroon; }
span.navy { color: navy; }
span.olive { color: olive; }
span.purple { color: purple; }
span.red { color: red; }
span.silver { color: silver; }
span.teal { color: teal; }
span.white { color: white; }
span.yellow { color: yellow; }

span.aqua-background { background: aqua; }
span.black-background { background: black; }
span.blue-background { background: blue; }
span.fuchsia-background { background: fuchsia; }
span.gray-background { background: gray; }
span.green-background { background: green; }
span.lime-background { background: lime; }
span.maroon-background { background: maroon; }
span.navy-background { background: navy; }
span.olive-background { background: olive; }
span.purple-background { background: purple; }
span.red-background { background: red; }
span.silver-background { background: silver; }
span.teal-background { background: teal; }
span.white-background { background: white; }
span.yellow-background { background: yellow; }

span.big { font-size: 2em; }
span.small { font-size: 0.6em; }

span.underline { text-decoration: underline; }
span.overline { text-decoration: overline; }
span.line-through { text-decoration: line-through; }


/*
 * xhtml11 specific
 *
 * */

tt {
  font-family: monospace;
  font-size: inherit;
  color: navy;
}

div.tableblock {
  margin-top: 1.0em;
  margin-bottom: 1.5em;
}
div.tableblock > table {
  border: 3px solid #527bbd;
}
thead, p.table.header {
  font-weight: bold;
  color: #527bbd;
}
p.table {
  margin-top: 0;
}
/* Because the table frame attribute is overriden by CSS in most browsers. */
div.tableblock > table[frame="void"] {
  border-style: none;
}
div.tableblock > table[frame="hsides"] {
  border-left-style: none;
  border-right-style: none;
}
div.tableblock > table[frame="vsides"] {
  border-top-style: none;
  border-bottom-style: none;
}


/*
 * html5 specific
 *
 * */

.monospaced {
  font-family: monospace;
  font-size: inherit;
  color: navy;
}

table.tableblock {
  margin-top: 1.0em;
  margin-bottom: 1.5em;
}
thead, p.tableblock.header {
  font-weight: bold;
  color: #527bbd;
}
p.tableblock {
  margin-top: 0;
}
table.tableblock {
  border-width: 3px;
  border-spacing: 0px;
  border-style: solid;
  border-color: #527bbd;
  border-collapse: collapse;
}
th.tableblock, td.tableblock {
  border-width: 1px;
  padding: 4px;
  border-style: solid;
  border-color: #527bbd;
}

table.tableblock.frame-topbot {
  border-left-style: hidden;
  border-right-style: hidden;
}
table.tableblock.frame-sides {
  border-top-style: hidden;
  border-bottom-style: hidden;
}
table.tableblock.frame-none {
  border-style: hidden;
}

th.tableblock.halign-left, td.tableblock.halign-left {
  text-align: left;
}
th.tableblock.halign-center, td.tableblock.halign-center {
  text-align: center;
}
th.tableblock.halign-right, td.tableblock.halign-right {
  text-align: right;
}

th.tableblock.valign-top, td.tableblock.valign-top {
  vertical-align: top;
}
th.tableblock.valign-middle, td.tableblock.valign-middle {
  vertical-align: middle;
}
th.tableblock.valign-bottom, td.tableblock.valign-bottom {
  vertical-align: bottom;
}


/*
 * manpage specific
 *
 * */

body.manpage h1 {
  padding-top: 0.5em;
  padding-bottom: 0.5em;
  border-top: 2px solid silver;
  border-bottom: 2px solid silver;
}
body.manpage h2 {
  border-style: none;
}
body.manpage div.sectionbody {
  margin-left: 3em;
}

@media print {
  body.manpage div#toc { display: none; }
}
</style>
<script type="text/javascript">
/*<![CDATA[*/
var asciidoc = {  // Namespace.

/////////////////////////////////////////////////////////////////////
// Table Of Contents generator
/////////////////////////////////////////////////////////////////////

/* Author: Mihai Bazon, September 2002
 * http://students.infoiasi.ro/~mishoo
 *
 * Table Of Content generator
 * Version: 0.4
 *
 * Feel free to use this script under the terms of the GNU General Public
 * License, as long as you do not remove or alter this notice.
 */

 /* modified by Troy D. Hanson, September 2006. License: GPL */
 /* modified by Stuart Rackham, 2006, 2009. License: GPL */

// toclevels = 1..4.
toc: function (toclevels) {

  function getText(el) {
    var text = "";
    for (var i = el.firstChild; i != null; i = i.nextSibling) {
      if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
        text += i.data;
      else if (i.firstChild != null)
        text += getText(i);
    }
    return text;
  }

  function TocEntry(el, text, toclevel) {
    this.element = el;
    this.text = text;
    this.toclevel = toclevel;
  }

  function tocEntries(el, toclevels) {
    var result = new Array;
    var re = new RegExp('[hH]([2-'+(toclevels+1)+'])');
    // Function that scans the DOM tree for header elements (the DOM2
    // nodeIterator API would be a better technique but not supported by all
    // browsers).
    var iterate = function (el) {
      for (var i = el.firstChild; i != null; i = i.nextSibling) {
        if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
          var mo = re.exec(i.tagName);
          if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
            result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
          }
          iterate(i);
        }
      }
    }
    iterate(el);
    return result;
  }

  var toc = document.getElementById("toc");
  if (!toc) {
    return;
  }

  // Delete existing TOC entries in case we're reloading the TOC.
  var tocEntriesToRemove = [];
  var i;
  for (i = 0; i < toc.childNodes.length; i++) {
    var entry = toc.childNodes[i];
    if (entry.nodeName == 'div'
     && entry.getAttribute("class")
     && entry.getAttribute("class").match(/^toclevel/))
      tocEntriesToRemove.push(entry);
  }
  for (i = 0; i < tocEntriesToRemove.length; i++) {
    toc.removeChild(tocEntriesToRemove[i]);
  }

  // Rebuild TOC entries.
  var entries = tocEntries(document.getElementById("content"), toclevels);
  for (var i = 0; i < entries.length; ++i) {
    var entry = entries[i];
    if (entry.element.id == "")
      entry.element.id = "_toc_" + i;
    var a = document.createElement("a");
    a.href = "#" + entry.element.id;
    a.appendChild(document.createTextNode(entry.text));
    var div = document.createElement("div");
    div.appendChild(a);
    div.className = "toclevel" + entry.toclevel;
    toc.appendChild(div);
  }
  if (entries.length == 0)
    toc.parentNode.removeChild(toc);
},


/////////////////////////////////////////////////////////////////////
// Footnotes generator
/////////////////////////////////////////////////////////////////////

/* Based on footnote generation code from:
 * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
 */

footnotes: function () {
  // Delete existing footnote entries in case we're reloading the footnodes.
  var i;
  var noteholder = document.getElementById("footnotes");
  if (!noteholder) {
    return;
  }
  var entriesToRemove = [];
  for (i = 0; i < noteholder.childNodes.length; i++) {
    var entry = noteholder.childNodes[i];
    if (entry.nodeName == 'div' && entry.getAttribute("class") == "footnote")
      entriesToRemove.push(entry);
  }
  for (i = 0; i < entriesToRemove.length; i++) {
    noteholder.removeChild(entriesToRemove[i]);
  }

  // Rebuild footnote entries.
  var cont = document.getElementById("content");
  var spans = cont.getElementsByTagName("span");
  var refs = {};
  var n = 0;
  for (i=0; i<spans.length; i++) {
    if (spans[i].className == "footnote") {
      n++;
      var note = spans[i].getAttribute("data-note");
      if (!note) {
        // Use [\s\S] in place of . so multi-line matches work.
        // Because JavaScript has no s (dotall) regex flag.
        note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
        spans[i].innerHTML =
          "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
          "' title='View footnote' class='footnote'>" + n + "</a>]";
        spans[i].setAttribute("data-note", note);
      }
      noteholder.innerHTML +=
        "<div class='footnote' id='_footnote_" + n + "'>" +
        "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
        n + "</a>. " + note + "</div>";
      var id =spans[i].getAttribute("id");
      if (id != null) refs["#"+id] = n;
    }
  }
  if (n == 0)
    noteholder.parentNode.removeChild(noteholder);
  else {
    // Process footnoterefs.
    for (i=0; i<spans.length; i++) {
      if (spans[i].className == "footnoteref") {
        var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
        href = href.match(/#.*/)[0];  // Because IE return full URL.
        n = refs[href];
        spans[i].innerHTML =
          "[<a href='#_footnote_" + n +
          "' title='View footnote' class='footnote'>" + n + "</a>]";
      }
    }
  }
},

install: function(toclevels) {
  var timerId;

  function reinstall() {
    asciidoc.footnotes();
    if (toclevels) {
      asciidoc.toc(toclevels);
    }
  }

  function reinstallAndRemoveTimer() {
    clearInterval(timerId);
    reinstall();
  }

  timerId = setInterval(reinstall, 500);
  if (document.addEventListener)
    document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
  else
    window.onload = reinstallAndRemoveTimer;
}

}
asciidoc.install(2);
/*]]>*/
</script>
</head>
<body class="article">
<div id="header">
<h1>Release notes for Gerrit 2.1.6</h1>
<span id="revnumber">version 2.1.6 (from v2.7-rc2-530-g4d7ac77)</span>
<div id="toc">
  <div id="toctitle">Table of Contents</div>
  <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
</div>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph"><p>Gerrit 2.1.6 is now available:</p></div>
<div class="paragraph"><p><a href="http://code.google.com/p/gerrit/downloads/detail?name=gerrit-2.1.6.war">http://code.google.com/p/gerrit/downloads/detail?name=gerrit-2.1.6.war</a></p></div>
</div>
</div>
<div class="sect1">
<h2 id="_schema_change">Schema Change</h2>
<div class="sectionbody">
<div class="paragraph"><p><strong>WARNING</strong> This release contains multiple schema changes.  To upgrade:</p></div>
<div class="listingblock">
<div class="content">
<pre><tt>  java -jar gerrit.war init -d site_path</tt></pre>
</div></div>
</div>
</div>
<div class="sect1">
<h2 id="_new_features">New Features</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_web_ui">Web UI</h3>
<div class="ulist"><ul>
<li>
<p>
issue 312 Abandoned changes can now be restored.
</p>
</li>
<li>
<p>
issue 698 Make date and time fields customizable
</p>
</li>
<li>
<p>
issue 556 Preference to display patch sets in reverse order
</p>
</li>
<li>
<p>
issue 584 Allow deleted and/or uncommented files to be skipped
</p>
</li>
<li>
<p>
Use HistogramDiff for content differences
</p>
<div class="paragraph"><p>HistogramDiff is an adaptation of Bram Cohen&#8217;s Patience Difference
algorithm, and was recently included in the upstream JGit project.
Patience Difference tends to produce more readable differences for
source code files, and JGit&#8217;s HistogramDiff implementation tends to
run several times faster than the prior Myers O(ND) algorithm.</p></div>
</li>
<li>
<p>
Automatic merge file content during submit
</p>
<div class="paragraph"><p>Project owners can now enable file-level content merge during submit,
allowing Gerrit to automatically resolve many path conflict cases.
This is built upon experimental merge code inherited from JGit,
and is therefore still experimental in Gerrit.</p></div>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_change_query">Change Query</h3>
<div class="ulist"><ul>
<li>
<p>
issue 688 Match branch, topic, project, ref by regular expressions
</p>
<div class="paragraph"><p>Similar to other features in Gerrit Code Review, starting any of these
expressions with \^ will now treat the argument as a regular
expression instead of an exact string match.</p></div>
</li>
<li>
<p>
Search changes by commit messages with <tt>message:</tt> operator.
</p>
</li>
<li>
<p>
issue 729 query: Add a --all-approvals option to queries
</p>
<div class="paragraph"><p>The new flag includes approval information for all patch sets in the
resulting query output.</p></div>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_notifications">Notifications</h3>
<div class="ulist"><ul>
<li>
<p>
Customize email notification templates
</p>
<div class="paragraph"><p>Email notifications are now driven by the Velocity template engine,
and may be modified by the site administrator by editing a template
file under <tt>'$site_path'/etc/mail</tt>.</p></div>
</li>
<li>
<p>
issue 311 Clarify email texts/subject
</p>
<div class="paragraph"><p>The default email notification formatting was changed to make the
subject lines and message bodies more consistent, and easier to
understand.</p></div>
</li>
<li>
<p>
issue 204 Add project list popup under Settings &gt; Watched Projects
</p>
<div class="paragraph"><p>The project list panel makes it easier for users to browse all
projects they have at least READ +1 access to, and add them to their
watched project set so notifications can be configured.</p></div>
</li>
<li>
<p>
stream-event support for all ref-update events
</p>
<div class="paragraph"><p>Whenever a ref is updated via either a direct push to a branch or a
Gerrit change submission, Gerrit will now send a new "ref-updated"
event to the event stream.</p></div>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_user_management">User Management</h3>
<div class="ulist"><ul>
<li>
<p>
SSO via client SSL certificates
</p>
<div class="paragraph"><p>A new auth.type of CLIENT_SSL_CERT_LDAP supports authenticating users
using client SSL certificates.  This feature requires using the
embedded Jetty web server with SSL enabled, and an LDAP directory to
lookup individual account information.</p></div>
</li>
<li>
<p>
issue 503 Inactive accounts may be disabled.
</p>
<div class="paragraph"><p>Administrators can manually update the accounts table, setting
inactive = <tt>Y</tt> to mark user accounts inactive.  Inactive accounts
cannot sign-in, cannot be added as a reviewer, and cannot be added
to a group.</p></div>
</li>
<li>
<p>
Improve the no-interactive-shell error message over SSH
</p>
<div class="paragraph"><p>Instead of giving a short <em>no shell available</em> error, Gerrit Code
Review now prints a banner letting the user know they have
authenticated successfully, interactive shells are disabled, and how
to clone a hosted project:</p></div>
<div class="listingblock">
<div class="content">
<pre><tt>$ ssh -p 29418 review.example.com

  ****    Welcome to Gerrit Code Review    ****

  Hi A. U. Thor, you have successfully connected over SSH.

  Unfortunately, interactive shells are disabled.
  To clone a hosted Git repository, use:

  git clone ssh://author@review.example.com:29418/REPOSITORY_NAME.git

Connection to review.example.com closed.</tt></pre>
</div></div>
</li>
<li>
<p>
Configure SSHD maxAuthTries, loginGraceTime, maxConnectionsPerUser
</p>
<div class="paragraph"><p>The internal SSH daemon now supports additional configuration
settings to reduce the risk of abuse.</p></div>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_administration">Administration</h3>
<div class="ulist"><ul>
<li>
<p>
issue 558 Allow Access rights to be edited by clicking on them.
</p>
</li>
<li>
<p>
New <em>Project Owner</em> system group to define default rights
</p>
<div class="paragraph"><p>The new system group <em>Project Owners</em> can be used in access
rights to mean any user that is a member of any group that
has the <em>Owner</em> access category granted within that project.
This system group is primarily useful in higher level projects
such as <em>-- All Projects --</em> to define standard access rights
for all project owners.</p></div>
</li>
<li>
<p>
issue 557 Allow rejection of changes without Change-Id line.
</p>
<div class="paragraph"><p>Project owners can set a flag to require all commits to include
the Gerrit specific <em>Change-Id: I&#8230;</em> line during initial upload,
reducing the risk of confusion when amends need to occur to
incorporate reviewer feedback.</p></div>
</li>
<li>
<p>
issue 613 create-project: Add --permissions-only option
</p>
<div class="paragraph"><p>The new flag skips creating the associated Git repository, making the
new project suitable for use as a parent to inherit permissions from.</p></div>
</li>
<li>
<p>
create-project: Optionally create empty initial commit
</p>
<div class="paragraph"><p>The <tt>repo</tt> tool used by Android doesn&#8217;t like to clone an empty Git
repository, making it difficult to setup a review for the initial file
contents.  create-project can now optionally create an empty initial
commit, permitting repo to sync the empty project.</p></div>
</li>
<li>
<p>
Block off commands on a server for certain user groups.
</p>
<div class="paragraph"><p>The upload.allowGroup and receive.allowGroup settings in gerrit.config
can be used to restrict which users can perform git clone/fetch or git
push on this server.  This can be useful if clone/fetch should be
limited to only site administrators, while normal users are supposed
to use to less expensive mirror servers.</p></div>
</li>
<li>
<p>
issue 685 Define gerrit.replicateOnStartup to control replication
</p>
<div class="paragraph"><p>The automatic replicate every project action that occurs during server
startup can now be disabled by setting replicateOnStartup = false.
This is primarily useful for sites with extremely large numbers of
projects and replication targets, but runs the risk of having a target
be out of date relative to the master server.</p></div>
</li>
<li>
<p>
New non-blocking function category "NoBlock"
</p>
<div class="paragraph"><p>Site defined approval categories may now use the function "NoBlock"
to permit scoring without blocking submission.  This is mostly
useful for automated tools to provide optional feedback on a change.</p></div>
</li>
<li>
<p>
Ability to reject commits from entering repository
</p>
<div class="paragraph"><p>The Git-note style branch <tt>refs/meta/reject-commits</tt> can be created
by the project owner or site administrator to define a list of
commits that must not be pushed into the repository.  This can be
useful after performing a project-wide filter-branch operation to
prevent the older (pre-filter-branch) history from being reintroduced
into the repository.</p></div>
</li>
</ul></div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_bug_fixes">Bug Fixes</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_web_ui_2">Web UI</h3>
<div class="ulist"><ul>
<li>
<p>
issue 498 Enable Keyboard navigation after change submit
</p>
</li>
<li>
<p>
issue 691 Make <em>]</em> on last file go up to change
</p>
</li>
<li>
<p>
issue 741 Make ENTER work for <em>Create Group</em>
</p>
</li>
<li>
<p>
issue 622 Denote a symbolic link in side-by-side viewer
</p>
</li>
<li>
<p>
issue 612 Display empty branch list when project has no repository
</p>
</li>
<li>
<p>
issue 672 Fix deleting exclusive branch level rights
</p>
</li>
<li>
<p>
issue 645 Display <em>No difference</em> between unchanged patchsets
</p>
</li>
<li>
<p>
Display groups as links to group information
</p>
</li>
<li>
<p>
Remove ctrl-d keybinding to discard comment, honor browser default
</p>
</li>
<li>
<p>
Do not auto enable save buttons, wait for changes to be made
</p>
</li>
<li>
<p>
Disable <em>Create Group</em> button if group name not entered
</p>
</li>
<li>
<p>
Show commit message in PatchScreen if old patch sets are compared
</p>
</li>
<li>
<p>
Fixed a number of focus and shortcut bugs in Firefox, Chrome
</p>
</li>
<li>
<p>
issue 487 Work around buggy MyersDiff by killing threads
</p>
<div class="paragraph"><p>MyersDiff sometimes locked up in an infinite loop when computing
the intraline difference information for a file.  These threads
are now killed after an administrator specified timeout
(cache.diff_intraline.timeout, default is 5 seconds).  If the
timeout is reached the file content is displayed without intraline
differences.  This offers reduced functionality to the end-user, but
prevents the "path of death" which usually took down a Gerrit server.</p></div>
</li>
<li>
<p>
Hide access rights not visible to user
</p>
<div class="paragraph"><p>Users were able to view access rights for branches they didn&#8217;t
actually have READ +1 permission on.  This may have leaked
information about branches and/or groups to users that shouldn&#8217;t
know about code names contained within either string.  Users that
are not project owners may now only view access rights for branches
they have at least READ +1 permission on.</p></div>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_change_query_2">Change Query</h3>
<div class="ulist"><ul>
<li>
<p>
issue 689 Fix age:4days to parse correctly
</p>
</li>
<li>
<p>
Make branch: operator slightly less ambiguous
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_push_support">Push Support</h3>
<div class="ulist"><ul>
<li>
<p>
issue 695 Permit changing only the author of a commit
</p>
<div class="paragraph"><p>Correcting only the author of a change failed to upload the new patch
set onto the existing change, as neither the message nor the files
were modified.  Fixed.</p></div>
</li>
<li>
<p>
issue 576 Allow Push Branch +3 to force replace a tag
</p>
<div class="paragraph"><p>Previously it was not possible to replace a tag object, even if
<tt>git push \--force</tt> was used.  Fixed.</p></div>
</li>
<li>
<p>
issue 690 Refuse to run receive-pack if refs/for/branch exists
</p>
<div class="paragraph"><p>If a server repository was corrupted by an administrator manually
creating a reference within the magical refs/for/ namespace, Gerrit
became confused when changes were uploaded for review.  If this case
occurs push now aborts very early, with a clear error message
indicating the problem.  To recover an administrator must clear the
refs/for/ namespace manually.</p></div>
</li>
<li>
<p>
Allow receive-pack without Read +2 but with Push Head +1
</p>
<div class="paragraph"><p>Users who had direct branch push permission but lacked the ability to
create changes for review were unable to push to a project.  Fixed.
This (finally) makes Gerrit a replacement for Gitosis or Gitolite.</p></div>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_replication">Replication</h3>
<div class="ulist"><ul>
<li>
<p>
issue 683 Don&#8217;t assume authGroup = "Registered Users" in replication
</p>
<div class="paragraph"><p>Previously a misconfigured authGroup in replication.config may have
caused the server to assume "Registered Users" instead of the group(s)
admin actually wanted.  This may have caused the replication to see
(or not see) the correct set of projects.</p></div>
</li>
<li>
<p>
issue 482 Upon replication fail, automatically retry later
</p>
<div class="paragraph"><p>If replication fails (for example due to temporary network
connectivity problems), other pending replication events to the
same server are deferred and retried later until successful.</p></div>
</li>
<li>
<p>
Replicate all refs received from push
</p>
<div class="paragraph"><p>Replication now replicates all references, not just those that
appear under <tt>refs/heads</tt>, <tt>refs/tags</tt>, or <tt>refs/changes</tt>.  This
fix may be relevant if the server supports user-private sandboxes
such as <tt>refs/dev/'$\{username\}'/*</tt>.</p></div>
</li>
<li>
<p>
issue 658 Allow refspec shortcuts (push = master) for replication
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_user_management_2">User Management</h3>
<div class="ulist"><ul>
<li>
<p>
Ensure proper escaping of LDAP group names
</p>
<div class="paragraph"><p>Some special characters may appear in LDAP group names, these must be
escape when looking up the group information from JNDI, otherwise the
lookup fails.  Fixed by applying the necessary escape sequences.</p></div>
</li>
<li>
<p>
Let login fail if user name cannot be set
</p>
<div class="paragraph"><p>If the user name for a new account is supposed to import from LDAP
but cannot because it is already in use by another user on this
server, the new account won&#8217;t be created.</p></div>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_administration_2">Administration</h3>
<div class="ulist"><ul>
<li>
<p>
gerrit.sh: actually verify running processes
</p>
<div class="paragraph"><p>Previously <tt>gerrit.sh check</tt> claimed a server was running if the
pid file was present, even if the process itself was dead.  It now
checks <tt>ps</tt> for the process before claiming it is running.</p></div>
</li>
<li>
<p>
Don&#8217;t allow exclusive branch rights to block Owner inheritance
</p>
<div class="paragraph"><p>Exclusive branch level rights prevented the a higher level branch
owner from managing the branch rights, unless they had an additional
access right for the exclusive rights.  Now Owner inheritance cannot
be blocked, ensuring that the higher level owner can manage their
entire namespace.</p></div>
</li>
<li>
<p>
Allow overriding permissions from parent project
</p>
<div class="paragraph"><p>Permissions in the parent project could not be overridden in the
child project.  Permissions can now be overidden if the category,
group name and reference name all match.</p></div>
</li>
</ul></div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_version">Version</h2>
<div class="sectionbody">
<div class="paragraph"><p>ef16a1816f293d00c33de9f90470021e2468a709</p></div>
</div>
</div>
</div>
<div id="footnotes"><hr /></div>
<div id="footer">
<div id="footer-text">
Version 2.1.6 (from v2.7-rc2-530-g4d7ac77)<br />
Last updated 2013-10-08 10:02:12 PDT
</div>
</div>
</body>
</html>
